#include "ui_widget.h"
#include "widget.h"
#include <QUdpSocket>
#include <QMessageBox>
#include <QDateTime>
#include <QNetworkInterface>
#include <QTextCodec>
#include <QFileDialog>



Widget::Widget(QWidget *parent,QString usrname) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    udpSocket = new QUdpSocket(this);
    //bind绑定端口
    udpSocket->bind(6666,QUdpSocket::ShareAddress);
    connect(udpSocket,&QUdpSocket::readyRead,this,&Widget::processPendingDatagrams);
}

Widget::~Widget()
{
    delete ui;
}


void Widget::processPendingDatagrams()
{

   QString time = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
    QByteArray datagram;// 拥有等待的数据报
    //hasPendingDatagrams判断是否还有等待读取的数据报。
    while (udpSocket->hasPendingDatagrams()) {
        // 让datagram的大小为等待处理的数据报的大小，这样才能接收到完整的数据
        //pendingDatagramSize获取当前数据报的大小。
        datagram.resize(udpSocket->pendingDatagramSize());
        udpSocket->readDatagram(datagram.data(),datagram.size());
       // ui->msgBrowser->append(str+"  He say:"+datagram);
        ui->msgBrowser->setTextColor(Qt::blue);
        ui->msgBrowser->setCurrentFont(QFont("Times New Roman",12));
        ui->msgBrowser->append("[ " +tr("对方")+" ] "+ time+"：\n"+datagram);

  }
}

void Widget::on_sendBtn_clicked()
{

    QString time = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");

    QByteArray datagram=ui->msgTxtEdit->toPlainText().toUtf8();
    /*它会发送size大小的数据报data到地址为address的主机的port端口，
   并返回成功发送的字节数；如果发送失败，返回-1 */

    if (ui->msgTxtEdit->toPlainText() == "") {
        QMessageBox::warning(0,tr("警告"),tr("发送内容不能为空"),QMessageBox::Ok);
        return;
    }
    udpSocket->writeDatagram(datagram.data(),datagram.size(),QHostAddress("127.0.0.1"),45454);
    ui->msgBrowser->setTextColor(Qt::blue);
    ui->msgBrowser->setCurrentFont(QFont("Times New Roman",12));
    ui->msgBrowser->append("[ " +tr("自己")+" ] "+ time+"：\n"+datagram);
    ui->msgTxtEdit->clear();
    ui->msgTxtEdit->setFocus();//重新设置光标输入焦点，即焦点保持不变

}

void Widget::getFileName(QString name)
{
    fileName = name;

}

//保存按钮点击事件的处理函数，完成聊天记录的保存功能
void Widget::on_saveTBtn_clicked()
{
    if (ui->msgBrowser->document()->isEmpty()) {
        QMessageBox::warning(0, tr("警告"), tr("聊天记录为空，无法保存！"), QMessageBox::Ok);
    } else {
        QString fname = QFileDialog::getSaveFileName(this,tr("保存聊天记录"), tr("聊天记录"), tr("文本(*.txt);;所有文件(*.*)"));
        if(!fname.isEmpty())
            saveFile(fname);
    }
}
//选择保存聊天记录的路径
bool Widget::saveFile(const QString &filename)
{
    QFile file(filename);
    if (!file.open(QFile::WriteOnly | QFile::Text)) {
        QMessageBox::warning(this, tr("保存文件"),tr("无法保存文件 %1:\n %2").arg(filename).arg(file.errorString()));
        return false;
    }
    QTextStream out(&file);
    out << ui->msgBrowser->toPlainText();

    return true;
}
void Widget::keyPressEvent(QKeyEvent *event)
{
    if(event->modifiers() == Qt::ControlModifier){
        if(event->key() == Qt::Key_Enter || event->key() == Qt::Key_Return){
            // 按键重复时不做处理
            if(event->isAutoRepeat()) return;
            on_sendBtn_clicked();
        }
    }
}

